#ifndef TELACLIENTE_H_
#define TELACLIENTE_H_

#include "Tela.h"
#include "../kisebo/Interesse.h"
#include "../kisebo/Logrador.h"
#include "../kisebo/Usuario.h"

#include <string>

using namespace std;

/**
 * @class TelaCliente TelaCliente.h "src/console/TelaCliente.h"
 * @brief TelaCliente para controle dos menus para o cliente.
 * A classe TelaCliente fornece opções de escolhas de menu para o cliente logado.
*/
class TelaCliente : public Tela
{

private:

	/**
	 * Opção selecionada no GetOpcao().
	 */
	char choice;

	/**
	 * Usuário logado no sistema, obtemos ele para fazer as modificações \n
	 * e depois atualizar no usuário do controlador.
	 */
	Usuario usuario;

private:

	/**
	 * @fn string GetValorPesquisa()
	 * @brief Pega o valor de pesquisa por interesse.
	 * @return O valor da pesquisa, a chave de busca.
	 */
	string GetValorPesquisa();

	/**
	 * @fn void ImprimeLivrosEncontrados(vector<Livro> _livros)
	 * @brief Metodo para imprimir os livros encontrados.
	 */
	void ImprimeLivrosEncontrados(vector<Livro> _livros);

	/**
	 * @fn void ConfirmaAtualizacao()
	 * @brief Metodo para imprimir a confirmacao do usuário.
	 */
	void ConfirmaAtualizacao();


	/**
	 * @fn char VerificaPesquisa()
	 * @brief Metodo para verificar se o usuário deseja pesquisar por outra chave.
	 * @return Um char com uma confirmação(S/N).
	 */
	char VerificaPesquisa();

public:

	/**
	 * @fn TelaCliente(Controlador* sys = NULL)
	 * @brief Construtor Cliente da entidade.
	 * Esse método cria uma instancia da TelaCliente, carregando o Controlador.
	*/
	TelaCliente(Controlador* sys = NULL);

	/**
	 * @fn virtual ~TelaCliente()
	 * @brief Destrutor da entidade.
	 * Utilizado para liberar espaço na mémoria, eliminando a instancia
	 * do objeto criado.
	*/
	virtual ~TelaCliente();

	/**
	 * @fn virtual void Show()
	 * @brief Método para mostrar o menu do cliente.
	 * O método imprime um menu de opções para o usuário.
	*/
	virtual void Show();

	/**
	 * @fn virtual void GetOpcao()
	 * @brief  Método para obter a opcao selecionada.
	 * O usuário seleciona uma opcao que deve ser armazenada e utilizada pelo SubmeteDado.
	*/
	virtual void GetOpcao();

	/**
	 * @fn virtual void SubmeteDado()
	 * @brief Método para verificar qual a ação a ser realizada.
	 * O método aciona uma ação de acordo com a opção selecionada.
	*/
	virtual void SubmeteDado();	// SubmeteCliente

	//Caso de Uso 4
	void SubmeteCEP();
	string ValidaCEP(string _cep);
};

#endif /*TELACLIENTE_H_*/
